﻿// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "Fog/Fog With Noise" 
{
	Properties
	{
		_MainTex ("Base (RGB)", 2D) = "white" {}
		_FogDensity ("Fog Density", Float) = 1.0
		_FogColor ("Fog Color", Color) = (1, 1, 1, 1)
		_FogStandard ("Fog Standard", Float) = 4.0
		_NoiseTex ("Noise Texture", 2D) = "white" {}
		_FogXSpeed ("Fog Horizontal Speed", Float) = 0.1
		_FogYSpeed ("Fog Vertical Speed", Float) = 0.1
		_NoiseAmount ("Noise Amount", Float) = 1
	}
	SubShader
	{
		Pass 
		{          	
			CGPROGRAM  
			
			#pragma vertex vert  
			#pragma fragment frag  

			#include "UnityCG.cginc"
		
			float4x4 _FrustumCornersRay;
			
			sampler2D _MainTex;
			half4 _MainTex_TexelSize;
			sampler2D _CameraDepthTexture;
			half _FogDensity;
			fixed4 _FogColor;
			float _FogStandard;
			sampler2D _NoiseTex;
			half _FogXSpeed;
			half _FogYSpeed;
			half _NoiseAmount;
			
			struct v2f 
			{
				float4 pos : SV_POSITION;
				float2 uv : TEXCOORD0;
				float2 uv_depth : TEXCOORD1;
				float4 interpolatedRay : TEXCOORD2;
			};
		
			v2f vert(appdata_img v) 
			{
				v2f o;
				o.pos = UnityObjectToClipPos(v.vertex);
				
				o.uv = v.texcoord;
				o.uv_depth = v.texcoord;
				
				#if UNITY_UV_STARTS_AT_TOP
				if (_MainTex_TexelSize.y < 0)
					o.uv_depth.y = 1 - o.uv_depth.y;
				#endif
				
				int index = 0;
				if (v.texcoord.x < 0.5 && v.texcoord.y < 0.5) 
				{
					index = 0;
				} 
				else if (v.texcoord.x > 0.5 && v.texcoord.y < 0.5) 
				{
					index = 1;
				} 
				else if (v.texcoord.x > 0.5 && v.texcoord.y > 0.5) 
				{
					index = 2;
				} 
				else 
				{
					index = 3;
				}

				#if UNITY_UV_STARTS_AT_TOP
				if (_MainTex_TexelSize.y < 0)
					index = 3 - index;
				#endif
				
				o.interpolatedRay = _FrustumCornersRay[index];
					 	 
				return o;
			}
		
			fixed4 frag(v2f i) : SV_Target 
			{
				float linearDepth = LinearEyeDepth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv_depth));
				float dis = distance(_WorldSpaceCameraPos, _WorldSpaceCameraPos + linearDepth * i.interpolatedRay.xyz);
				
				float2 speed = _Time.y * float2(_FogXSpeed, _FogYSpeed);
				float noise = (tex2D(_NoiseTex, i.uv + speed).r - 0.5) * _NoiseAmount;
						
				float fogDensity = pow(dis / _FogStandard, 1.5); 
				fogDensity = saturate(fogDensity * _FogDensity * (1 + noise));
				
				fixed4 finalColor = tex2D(_MainTex, i.uv);
				_FogColor.a = _FogColor.a * 2.5 + lerp(0, 1 - _FogColor.a * 2.5, fogDensity);
				finalColor.rgb = lerp(finalColor.rgb, finalColor * (1- _FogColor.a) + _FogColor.rgb * _FogColor.a, fogDensity);

				return finalColor;
			}
			  
			ENDCG
		}
	} 
	FallBack Off
}
